fix(onboard): skip Ollama loopback override when sudo -n unavailable (#5716) - #5996
Conversation
…5716) `nemoclaw onboard --non-interactive --yes` on a Linux aarch64 DGX Station (or any Linux host) without passwordless sudo previously hit step `[3/8] Configuring inference provider`, auto-selected `Provider: ollama` (recovered from a prior sandbox), then tried the Ollama systemd loopback override with `sudo -n install / daemon- reload / restart`. `sudo -n` fails with "sudo: a password is required" on hosts without passwordless sudo, and the wizard aborted with `Refusing to continue with a potentially non-loopback Ollama bind` and exit code 1. The non-interactive contract is broken: a headless install pipeline cannot recover from an interactive sudo prompt. Detect the missing passwordless sudo upfront via a `sudo -n true` probe and skip the loopback override with an actionable warning ("Skipping Ollama systemd loopback override: passwordless sudo is not available on this host. Ollama will keep its current bind; set NEMOCLAW_NON_INTERACTIVE_SUDO_MODE=prompt to allow a password prompt, or configure passwordless sudo to restore loopback hardening."). Ollama continues running on its existing bind so the headless onboard finishes; the host operator can re-run later to restore the loopback hardening. The probe is dependency-injected via a new `hasPasswordlessSudoImpl` test seam, along with `platformImpl` and `hasOllamaSystemdUnitImpl` seams that let the new fall-through path be exercised deterministically from non-Linux dev hosts. Two new unit tests cover the skip-with-warning path and the platform gate. Closes #5716. Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthrough
ChangesPasswordless sudo guard for Ollama systemd override
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
Code Coverage OverviewLanguages: TypeScript TypeScript / code-coverage/pluginThe overall coverage in the Show a code coverage summary of the most covered files.
TypeScript / code-coverage/cliThe overall coverage in the Show a code coverage summary of the most covered files.
Updated |
PR Review Advisor (Nemotron Ultra) — Changes requestedMerge posture: Do not merge yet Action checklist
Findings index
🚨 Required before mergeAddress these before merging unless a maintainer explicitly overrides the advisor with rationale.
|
PR Review Advisor — Changes requestedMerge posture: Do not merge yet Action checklist
Findings index
🚨 Required before mergeAddress these before merging unless a maintainer explicitly overrides the advisor with rationale.
|
E2E Advisor RecommendationRequired E2E: Dispatch hint: Full advisor summaryE2E Recommendation AdvisorBase: Required E2E
Optional E2E
New E2E recommendations
Dispatch hint
|
Vitest E2E Scenario RecommendationRequired Vitest E2E scenarios: Dispatch required Vitest E2E scenarios:
Full Vitest E2E advisor summaryVitest E2E Scenario AdvisorBase: Required Vitest E2E scenarios
Optional Vitest E2E scenarios
Relevant changed files
|
Selective E2E Results —
|
| Job | Result |
|---|---|
| gpu-e2e | ⏭️ skipped |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/lib/onboard/ollama-systemd.test.ts`:
- Around line 100-118: This test is still affected by the ambient
NEMOCLAW_NON_INTERACTIVE_SUDO_MODE environment, which can change the behavior of
ensureOllamaLoopbackSystemdOverride via getSudoPrefix and bypass the intended
sudo -n branch. In the ollama-systemd test, isolate the environment by
explicitly setting or stubbing the sudo-mode env for the duration of this case,
and restore it afterward, so the assertions always exercise the non-interactive
passwordless-sudo guard instead of real sudo/systemd behavior.
- Around line 121-128: The non-Linux test for
ensureOllamaLoopbackSystemdOverride is too weak because hasPasswordlessSudoImpl
returning false would still allow the test to pass even if Linux-only checks
were reached. Update the test in ollama-systemd.test.ts so the Linux-only probes
(especially hasOllamaSystemdUnitImpl and hasPasswordlessSudoImpl) throw if
invoked, while platformImpl returns "darwin"; this will prove the platform gate
short-circuits before any Linux-specific logic runs.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: b3ab0e6d-408a-4696-afc8-a083f5976abb
📒 Files selected for processing (2)
src/lib/onboard/ollama-systemd.test.tssrc/lib/onboard/ollama-systemd.ts
Multiple targeted fixes for PR #5996. Advisor PRA-3 (required) + CI repository-checks (no-test-dist-imports): src/lib/onboard/ollama-systemd.test.ts imported the symbols under test from `../../../dist/lib/...`. The repository's source-shape contract requires src/ tests to import from source, with compiled artifact assertions confined to test/package-contract/. Switch the imports to the source-relative paths and the contract test fires on every run rather than against a stale dist build. Advisor PRA-2 (required): the silent skip-with-warning path accepts a weaker security posture (Ollama on its existing non-loopback bind) in exchange for not breaking the headless install contract. Document the trade-off and the two escape hatches at the call site: the NEMOCLAW_NON_INTERACTIVE_SUDO_MODE=prompt env var (opts back into a real sudo prompt when a TTY is attached), and the explicit warning that names the override in stderr so a CI log capture surfaces the re-tighten knob without a source dive. Aborting with process.exit(1) is explicitly rejected as a regression to the original #5716 break. CodeRabbit (Minor): isolate NEMOCLAW_NON_INTERACTIVE_SUDO_MODE in the first new test so an outer shell that has set it to `prompt` cannot change which branch of getSudoPrefix the test exercises. Save and restore the previous value around the assertion. CodeRabbit (Minor): prove the platform gate in the non-Linux test by making the Linux-only systemd-unit and passwordless-sudo probes throw if reached. With the platform set to darwin, the function must return before either probe runs; the throwing implementations make any accidental probe reachability fail the test loudly. Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
Selective E2E Results —
|
| Job | Result |
|---|---|
| gpu-e2e | ⏭️ skipped |
…wth guardrail) The previous round added a try/finally restore of NEMOCLAW_NON_INTERACTIVE_SUDO_MODE that ended in a small if/else branch. The codebase-growth-guardrails CI gate rejects any net new `if` statement in changed test files (tests should stay linear). Move the save/restore into `beforeEach`/`afterEach` for the #5716 describe block and extract the assign-or-delete into a top-level `restoreEnv` helper that uses a ternary statement so the test bodies remain if-free. Behavior is identical and the CR isolation contract still holds (the env is forced to its default at the start of every test in this block and restored to its original value after). Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
Selective E2E Results —
|
| Job | Result |
|---|---|
| gpu-e2e | ⏭️ skipped |
Ultra advisor PRA-4 (required) called out the missing happy-path test. Every existing case in the #5716 block exercises either the new skip-with-warning gate or an early return on a non-Linux platform. A regression that inverted the new gate's condition (`!hasPasswordlessSudo()` -> `hasPasswordlessSudo()`) would still pass every prior test in the block while silently skipping the loopback override on hosts that have passwordless sudo. Add an explicit happy-path test that pins the gate's behaviour when sudo IS available: the function must NOT emit the "passwordless sudo is not available" warning and must NOT short-circuit via the new skip path. Downstream of the gate, the function continues into the live override path (real runShell against systemd) which then fails because the test host has no real Ollama systemd unit. The test tolerates that downstream failure via a process.exit stub that re-raises a controlled exception; the assertion is scoped to the gate behaviour, not the downstream side effects, which is the ONLY thing PRA-4 asks for. Also rename the describe title from "ensureOllamaLoopbackSystemdOverride (#5716 non-interactive sudo)" to "ensureOllamaLoopbackSystemdOverride non-interactive sudo (#5716)" to satisfy the repository test-title-style check (issue references must land as a final '(#1234)' suffix). This was the sole repository-checks failure on the prior commit. Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/lib/onboard/ollama-systemd.test.ts`:
- Around line 153-176: The happy-path test for
ensureOllamaLoopbackSystemdOverride is still crossing into host-boundary
behavior after the sudo check, so it can mutate the runner environment and rely
on a process.exit stub. Add or use a deterministic seam immediately after the
passwordless-sudo gate (for example, a pure helper or injectable boundary before
the first real systemd/shell action) and update this test to stop at that
boundary while still verifying the “passwordless sudo available” branch.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 46bfb8bb-3ec3-4736-b024-eb84a99e2415
📒 Files selected for processing (1)
src/lib/onboard/ollama-systemd.test.ts
Selective E2E Results —
|
| Job | Result |
|---|---|
| gpu-e2e | ⏭️ skipped |
…llow-up) CodeRabbit flagged the prior happy-path test as non-hermetic. With hasPasswordlessSudoImpl returning true, the test fell through into the real systemd override path. On a Linux CI runner that has passwordless sudo, the test would write a real /etc/systemd/system drop-in and restart Ollama -- a host-boundary side effect under what is meant to be a pure unit test of the new gate. Extract the gate's decision into a pure exported helper `shouldSkipOllamaLoopbackForMissingSudo(sudoPrefix, hasPasswordlessSudo)` that returns true exactly when the override must be skipped (the sudoPrefix is "sudo -n" AND the passwordless-sudo probe is false). The call site in `ensureOllamaLoopbackSystemdOverride` now reads as a single boolean predicate, the probe creation goes through a small named `defaultHasPasswordlessSudo` helper, and the prior bigger inline lambda is gone. Replace the one happy-path test (which had the process.exit stub gymnastics) with four small predicate tests over the pure helper: the skip branch, the happy-path branch with sudo available, both "sudo" (interactive) cases, and a call-counting test that proves the probe is short-circuited away when sudoPrefix is "sudo". Every branch the production code can take is now covered by an assertion that does not touch the filesystem, systemd, or `runShell`. 12/12 tests pass, Biome clean, no if statements added, typecheck clean. Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
Selective E2E Results —
|
| Job | Result |
|---|---|
| gpu-double-onboard-e2e | ⏭️ skipped |
| gpu-e2e | ⏭️ skipped |
Selective E2E Results —
|
| Job | Result |
|---|---|
| gpu-e2e | ⏭️ skipped |
|
🌿 Preview your docs: https://nvidia-preview-pr-5996.docs.buildwithfern.com/nemoclaw |
cv
left a comment
There was a problem hiding this comment.
Maintainer security follow-up on exact head 890c887:
The earlier missing-sudo implementation was not acceptable because it returned generic not-applicable and could preserve a wildcard Ollama listener. The current head resolves that blocker without weakening the boundary:
sudo -n trueis checked before any privileged override command.- Missing sudo may continue only when
systemctl is-active ollama.servicesucceeds andss -H -ltnshows at least one:11434listener with every matching address in IPv4/IPv6 loopback. - Wildcard, LAN, missing, unavailable-
ss, inactive-service, and unparseable evidence all fail closed with the prompt/passwordless-sudo recovery guidance. - A successful request to
127.0.0.1is deliberately not used as proof because wildcard binds also answer there. - The safe branch returns
ready; the unsafe branch exits inside the override boundary, so no caller can treat skipped hardening as ordinary non-applicability.
Validation: 16 focused listener/override tests, 56 adjacent install/onboarding tests, CLI type-check, growth/source-shape checks, normal full CLI commit hook, pre-push checks, and Fern docs validation. Exact-head GPU Vitest E2E is run 28430942420.
This is a security-resolution review, not an approval or waiver of required CI, automated advisor, GPU E2E, or independent human approval gates.
E2E Target RecommendationRequired E2E targets: None Full E2E target advisor summaryE2E Target AdvisorBase: Required E2E targets
Optional E2E targets
Relevant changed files
|
Signed-off-by: Carlos Villela <cvillela@nvidia.com>
Vitest E2E Scenario Results — ✅ All requested jobs passedRun: 28430942420
|
…VIDIA#5716) (NVIDIA#5996) <!-- markdownlint-disable MD041 --> ## Summary Non-interactive Linux onboarding now detects unavailable `sudo -n` before attempting the Ollama systemd override. It continues only when the active systemd Ollama listener is positively verified as loopback-only; wildcard, non-loopback, missing, or unparseable listener state fails early with actionable sudo guidance. ## Related Issue Fixes NVIDIA#5716. ## Changes - Probe passwordless sudo before any systemd override command. - Inspect the active Ollama listener with non-privileged `systemctl` and `ss` evidence when sudo is unavailable. - Continue without rewriting the drop-in only when every `:11434` listener is IPv4, IPv6, or IPv4-mapped loopback. - Fail closed before proxy/model setup when listener exposure cannot be proven safe, and point operators to `NEMOCLAW_NON_INTERACTIVE_SUDO_MODE=prompt` or passwordless sudo. - Cover safe and unsafe listener states, sudo-gate behavior, and adjacent install/onboarding callers. - Document the non-interactive systemd behavior in the local-inference guide. ## Security posture A successful HTTP request to `127.0.0.1:11434` is not accepted as proof because a wildcard listener answers there too. The fallback requires an active systemd service plus socket-level listener evidence; otherwise the established fail-closed path remains in force. ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [x] Code change with doc updates - [ ] Doc only (prose changes, no code sample modifications) - [ ] Doc only (includes code sample changes) ## Quality Gates - [x] Tests added or updated for changed behavior - [ ] Existing tests cover changed behavior — justification: - [ ] Tests not applicable — justification: - [x] Docs updated for user-facing behavior changes - [ ] Docs not applicable — justification: - [x] Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging) - [x] Sensitive-path review completed or maintainer-approved waiver recorded — fail-closed wildcard/non-loopback handling and positive listener evidence were reviewed in the signed maintainer follow-up; exact-head automated advisors are also running. - [ ] Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue: ## Verification - [x] PR description includes the DCO sign-off declaration and every commit appears as `Verified` in GitHub - [x] Git hooks passed during commit and push, or `npx prek run --from-ref main --to-ref HEAD` passes - [x] Targeted tests pass for changed behavior - [ ] Full `npm test` passes (broad runtime changes only) - [x] Quality Gates section completed with required justifications or waivers - [x] No secrets, API keys, or credentials committed - [ ] `npm run docs` builds without warnings (doc changes only) — Fern completed with 0 errors and the same 2 existing warnings - [x] Doc pages follow the [style guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md) (doc changes only) - [ ] New doc pages include SPDX header and frontmatter (new pages only) Focused evidence: 16 Ollama systemd/listener tests, 56 adjacent onboarding/install tests, CLI type-check, 23 source-shape/title/conditional budget tests, a normal commit hook rerun with the full CLI suite green, pre-push hooks, and Fern docs validation with 0 errors. The first full hook attempt hit one unrelated 5-second timeout in `policy-channel-remove-flow.test.ts`; that test passed alone in 170 ms and the normal hook rerun passed. --- Signed-off-by: Charan Jagwani <cjagwani@nvidia.com> Signed-off-by: Carlos Villela <cvillela@nvidia.com> --------- Signed-off-by: Charan Jagwani <cjagwani@nvidia.com> Signed-off-by: Carlos Villela <cvillela@nvidia.com> Co-authored-by: Carlos Villela <cvillela@nvidia.com>
) ## Summary First incremental step on #6014. The Ollama auth proxy now independently verifies that the Ollama backend is listening only on loopback before declaring itself ready, with a structured exit signal the host CLI renders as a specific actionable remediation. Leaves the existing root-level systemd loopback override (#5996, #5716) in place for this PR. ## Why an independent probe in the proxy The proxy currently trusts the systemd drop-in to keep Ollama bound to `127.0.0.1`. If a user manually edits `OLLAMA_HOST` to `0.0.0.0`, the proxy still forwards to `127.0.0.1:11434` successfully (Ollama listens there too) but Ollama is ALSO publicly reachable on `0.0.0.0:11434`, bypassing the proxy's bearer-token check entirely. The new probe runs before `server.listen` and refuses to start with exit code 2 if it sees any non-loopback listener on the backend port. This moves bind-policy enforcement off the root-coupled systemd path and onto the proxy itself; the systemd drop-in becomes pure defense-in-depth that subsequent PRs can retire. ## Changes - `scripts/ollama-auth-proxy.mts`: - Independently enumerates backend listeners through `/proc/net/tcp{,6}` with an `lsof` fallback and refuses any non-loopback listener before `server.listen`. - Recognizes the full `127.0.0.0/8`, `::1`, and IPv4-mapped IPv6 loopback shapes both in listener classification and in deciding whether a local backend URL requires the probe. - Writes structured startup failure status for host-side remediation and retains the explicit audited operator override. - Is fully checked by `tsconfig.cli.json`; no `@ts-nocheck` suppression remains. - Keeps side effects inside `main()`, gated by `import.meta.main`, while exporting typed helpers for focused tests. - `src/lib/inference/ollama/proxy.ts`: - Persist a sentinel path (`~/.nemoclaw/ollama-auth-proxy.status`) and pass it to the spawned proxy via env - On proxy spawn, unlink any stale status file so a later read sees the new proxy's reason - When the readiness loop observes the proxy gone, read the status file via `readProxyExitStatus` and render specific remediation via `printProxyStartupReason` for the `backend-not-loopback` reason; fall back to existing port-conflict or generic message when no status file is present - `test/ollama-auth-proxy-bind-probe.test.ts`: 40 Vitest cases cover listener parsing, all supported loopback encodings, explicit rejects, local-versus-remote backend trigger selection, the exit-code contract, and Linux `/proc` integration. ## What this does NOT do (follow-up PRs per #6014) - Does not delete `ensureOllamaLoopbackSystemdOverride`. The systemd drop-in still runs on Linux and stays the authority for Ollama's bind on a fresh install. The probe is independent enforcement on top, not a replacement. - Does not relocate `OLLAMA_CONTEXT_LENGTH` or the Spark `OLLAMA_LLM_LIBRARY=cuda_v13` overrides off the systemd drop-in. Those are load-bearing for non-security reasons and belong in a follow-up that moves them to a config-only path before the drop-in writer can be deleted. - Does not add periodic re-probing during proxy lifetime; the current PR only checks at startup. A follow-up could probe periodically to catch mid-run bind changes. - Does not cover Docker-Desktop topologies (WSL + Windows-host Ollama, WSL + WSL-local Ollama). Those bypass the proxy entirely via `containerCanReachHostLoopback()` and are out of scope per #6014. ## Verification - `npx vitest run test/ollama-auth-proxy-bind-probe.test.ts` — 38 passed, 2 platform skips on macOS - Eight focused Ollama proxy suites — 110 passed, 2 platform skips - `npm run typecheck:cli` — passed with the proxy script fully type-checked - `npm run checks:repository` — repository architecture and source-shape checks passed - `npm run docs` — 0 errors, 2 existing warnings - `src/lib/shields/policy-transition.test.ts` carries the exact one-line setup-hook stabilization from upstream PR #8572 (commit `78f681e72`) after current-main CI reproduced the 10-second hook timeout three times on this PR. ## Related - Issue #6014 (architectural follow-up) - PR #5996 (the symptom fix that opened #6014) - Issue #5716 (the user-visible bug) ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [x] Code change with doc updates - [ ] Doc only (prose changes, no code sample modifications) - [ ] Doc only (includes code sample changes) ## Documentation Writer Review <!-- Required for code and documentation changes after the changes and applicable validation are complete. Keep one review checkbox and one instance of each visible or hidden field. For Evidence, list changed documentation paths. For documentation-only changes, also state that the writing rules and documentation style were reviewed. For other results, explain why no documentation change is needed or why the review is blocked. For Agent, use a consistent product and surface name, such as Codex Desktop, Codex CLI, Claude Code, or Cursor. After committing all review changes, put `git rev-parse --short HEAD` and `git rev-parse --short HEAD:AGENTS.md` in the hidden metadata below. Rerun the review and refresh that metadata after any new commit. This receipt is advisory during the data-collection pilot. --> - [x] Documentation writer subagent reviewed the completed changes - Result: `docs-updated` - Evidence: `SECURITY.md`. Independent Codex Desktop review passed for exact head `74431d39a`. The threat model accurately documents the Ollama auth proxy loopback bind probe, its full `127.0.0.0/8`, `::1`, and IPv4-mapped IPv6 loopback coverage, non-loopback refusal, operator override, unavailable-probe fallback, startup-only enforcement, regression coverage, and scope limits. Removing `@ts-nocheck` preserves behavior, the broadened trigger aligns all recognized loopback backend hostnames with that documented guarantee, and the Vitest setup-hook timeout change requires no additional documentation. - Agent: Codex Desktop <!-- docs-review-head-sha: 74431d3 --> <!-- docs-review-agents-blob-sha: 12ad395 --> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added structured proxy startup failure “status file” and clearer readiness-loop diagnostics. * Enhanced the Ollama auth proxy with Bearer-token authentication and loopback-only backend enforcement. * **Bug Fixes** * Improved startup failure reporting by surfacing a specific “backend-not-loopback” reason and remediation guidance when misconfigured. * Improved proxy forwarding error responses with consistent HTTP status handling. * **Tests** * Added Vitest coverage for loopback bind/probe detection, address classification (proc/net and lsof), and contract constant assertions. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Signed-off-by: Charan Jagwani <cjagwani@nvidia.com> --------- Signed-off-by: Charan Jagwani <cjagwani@nvidia.com> Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Prekshi Vyas <34834085+prekshivyas@users.noreply.github.com> Co-authored-by: Carlos Villela <cvillela@nvidia.com> Co-authored-by: Prekshi Vyas <prekshiv@nvidia.com>
Summary
Non-interactive Linux onboarding now detects unavailable
sudo -nbefore attempting the Ollama systemd override. It continues only when the active systemd Ollama listener is positively verified as loopback-only; wildcard, non-loopback, missing, or unparseable listener state fails early with actionable sudo guidance.Related Issue
Fixes #5716.
Changes
systemctlandssevidence when sudo is unavailable.:11434listener is IPv4, IPv6, or IPv4-mapped loopback.NEMOCLAW_NON_INTERACTIVE_SUDO_MODE=promptor passwordless sudo.Security posture
A successful HTTP request to
127.0.0.1:11434is not accepted as proof because a wildcard listener answers there too. The fallback requires an active systemd service plus socket-level listener evidence; otherwise the established fail-closed path remains in force.Type of Change
Quality Gates
Verification
Verifiedin GitHubnpx prek run --from-ref main --to-ref HEADpassesnpm testpasses (broad runtime changes only)npm run docsbuilds without warnings (doc changes only) — Fern completed with 0 errors and the same 2 existing warningsFocused evidence: 16 Ollama systemd/listener tests, 56 adjacent onboarding/install tests, CLI type-check, 23 source-shape/title/conditional budget tests, a normal commit hook rerun with the full CLI suite green, pre-push hooks, and Fern docs validation with 0 errors. The first full hook attempt hit one unrelated 5-second timeout in
policy-channel-remove-flow.test.ts; that test passed alone in 170 ms and the normal hook rerun passed.Signed-off-by: Charan Jagwani cjagwani@nvidia.com
Signed-off-by: Carlos Villela cvillela@nvidia.com